package com.ruyuan2020.im.design.mementopattern.use;

/**
 * Memento类是一个简单的Java Bean，用于存储TextDocument的状态。
 * TextDocument类有设置和获取内容的方法，以及创建备忘录和从备忘录中恢复状态的方法。
 * Caretaker类负责管理备忘录对象，它使用一个栈来存储备忘录，以便可以依次撤销多个操作。
 * 这个实现保持了TextDocument类的封装性，因为管理者类Caretaker不需要了解TextDocument的内部实现细节,
 * 同时，client代码可以轻松地保存和恢复文档的状态，而不需要直接操作文档的内部状态
 */
public class Client {
    public static void main(String[] args) {
        TextDocument document = new TextDocument();
        Caretaker caretaker = new Caretaker();

        System.out.println("初始内容: " + document.getContent());

        document.setContent("第一次编辑");
        caretaker.addMemento(document.saveToMemento());
        System.out.println("编辑后内容: " + document.getContent());

        document.setContent("第二次编辑");
        System.out.println("再次编辑后内容: " + document.getContent());

        // 使用备忘录恢复状态
        if (caretaker.hasSavedStates()) {
            document.restoreFromMemento(caretaker.getMemento());
            System.out.println("撤销后内容: " + document.getContent());
        }

        // 尝试再次撤销，但没有更多的保存状态了
        if (caretaker.hasSavedStates()) {
            document.restoreFromMemento(caretaker.getMemento());
            System.out.println("再次撤销后内容: " + document.getContent());
        } else {
            System.out.println("没有更多的状态可以撤销了。");
        }
    }
}
